package com.xiao.service.impl;

import com.xiao.dao.EmployeeDao;
import com.xiao.entity.EmployeeEntity;
import com.xiao.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @_PackageName:com.xiao.service.impl
 * @_ClassName:EmployeeServiceImpl
 * @_Description:
 *      cacheNames/value：指定缓存组件的名字;将方法的返回结果放在哪个缓存中，是数组的方式，可以指定多个缓存；
 *      key：缓存数据使用的key；可以用它来指定。默认是使用方法参数的值 1-方法的返回值， 编写SpEL； #id;参数id的值 #a0 #p0 #root.args[0] getEmp[2]
 *      keyGenerator：key的生成器；可以自己指定key的生成器的组件id，key/keyGenerator：二选一使用;
 *      cacheManager：指定缓存管理器；或者cacheResolver指定获取解析器
 *      condition：指定符合条件的情况下才缓存； condition = "#a0>1"：第一个参数的值》1的时候才进行缓存
 *      unless:否定缓存；当unless指定的条件为true，方法的返回值就不会被缓存；可以获取到结果进行判断
 * @_Author：笑老二
 * @_data 2020/12/14 17:15
 */
@Service
@CacheConfig(cacheNames = "emp")
public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    private EmployeeDao employeeDao;

    @Override
    @Cacheable(cacheNames = "empList")//该注解用于向缓存中存入数据
    public List<EmployeeEntity> findAll() {
        return employeeDao.findAll();
    }

    @Override
    @Cacheable(key = "#p0")//该注解用于向缓存中存入数据
    public EmployeeEntity findOneByEid(int eid) {
        return employeeDao.findOneByEid(eid);
    }

    @Override
    @CacheEvict(key = "#p0")//删除缓存数据
    public int delete(int eid) {
        return employeeDao.delete(eid);
    }

    @Override
    @Cacheable(cacheNames = "empList")
    @CacheEvict(allEntries = true)//该注解删除当前缓存类型中的所有缓存
    public int insert(EmployeeEntity employeeEntity) {
        return employeeDao.insert(employeeEntity);
    }

    /*
        @CachePut(key = "#p0.eid")
        #p0.eid:以返回值结果的 eid 属性作为自定义缓存Key
        该注解会找到这个eid对应的 employeeEntity 缓存对象，
        清除eid中的缓存 ，然后再把当前方法返回的 EmployeeEntity 对象重新作为Cache写入到这个key：eid中
        所以：如果想要更新的数据重新写入到 Cache 中就需要 返回一个你要更新的对象
     */
    @Override
    @CachePut(key = "#p0.eid")
    public EmployeeEntity update(EmployeeEntity employeeEntity) {
        employeeDao.update(employeeEntity);
        return employeeEntity;
    }
}
